
/**
 * \file Jeu.h
 * \brief Module gérant les différentes actions du jeu
 * \author Carrillon Sovanna
 * \version 1.0
 * \date juin 2011
 */

#ifndef JEU_H
#define JEU_H

#include "Link.h"
#include "Carte.h"
#include "Monstre.h"

#include <time.h>


/**
  * \struct Jeu
  * \brief Contient toutes les informations sur la partie en cours : link, la carte des zones, un tableau de monstres présents sur la zone active de la carte et le nombres de monstres
  */
struct sJeu
    {
    	Link link;
        Carte carte;
        /** tableau de monstres présents sur la zone active de la carte */
        Monstre* tab_monstres;
        int nb_monstres;
    };
/** \typedef renommage de sZone en Zone */
typedef struct sJeu Jeu;


/**
  * \brief Initialise le jeu
  * \param [in,out] p_jeu : pointeur sur le jeu à initialiser
  */
void jeuInit(Jeu* p_jeu);

/**
  * \brief Libère le jeu
  * \param [in,out] p_jeu : pointeur sur le jeu à libérer
  */
void jeuLibere(Jeu* p_jeu);

/**
  * \brief Renvoie la carte du jeu
  * \param [in] p_jeu : pointeur sur le Jeu
  * \return pointeur sur Carte
  */
Carte* jeuGetPCarte(Jeu* p_jeu);

/**
  * \brief Renvoie la carte du jeu
  * \param [in] p_jeu : pointeur sur le Jeu
  * \return pointeur constant sur Carte
  */
const Carte* jeuGetConstPCarte(const Jeu* p_jeu);


/**
  * \brief Renvoie un pointeur vers le contenu du champ link du jeu
  * \param [in] p_jeu : pointeur sur le Jeu
  * \return pointeur sur Link
  */
Link* jeuGetPLink(Jeu* p_jeu);

/**
  * \brief Renvoie un pointeur vers le contenu du champ link du jeu
  * \param [in] p_jeu : pointeur sur le Jeu
  * \return pointeur constant sur Link
  */
const Link* jeuGetConstPLink(const Jeu* p_jeu);


/**
  * \brief Renvoie le tableau de monstres du jeu
  * \param [in] p_jeu : pointeur sur le Jeu
  * \return tableau de monstres
  */
Monstre* jeuGetTabMonstres(Jeu* p_jeu);

/**
  * \brief Renvoie le tableau de monstres du jeu
  * \param [in] p_jeu : pointeur sur le Jeu
  * \return tableau de monstres sous forme de pointeur constant
  */
const Monstre* jeuGetConstTabMonstres(const Jeu* p_jeu);



/**
  * \brief Met à jour le tableau de monstres du jeu avec ceux de la zone voulue
  * \param [in,out] p_jeu : pointeur sur le Jeu
  * \param [in] num_zone : numéro de zone
  */
void jeuChargeMonstresZone(Jeu* p_jeu, int num_zone);

/**
  * \brief Change de zone si link se trouve sur un bloc "changeur de zone"
  * \param [in,out] p_jeu : pointeur sur le Jeu
  * met à jour la zone active de la carte, la position de link, le tableau de monstres si nécessaire
  */
void jeuVerifieChangementZone(Jeu* p_jeu);

/**
  * \brief Met à jour ce qu'il faut si certains évenements sont détectés (changement de zone ou ramassage d'un objet pour l'instant)
  * \param [in,out] p_jeu : pointeur sur Jeu
  */
void jeuVerifieEvenements(Jeu* p_jeu);

/**
  * \brief Renvoie vrai si l'emplacement aux coordonées (x,y) est accessible, faux sinon
  * \param [in] p_jeu : pointeur sur Jeu
  * \param [in] x : entier
  * \param [in] y : entier
  * \return Vrai ou Faux
  */
bool jeuEstPositionAccessible (const Jeu* p_jeu, int x, int y);

/**
  * \brief Met à jour ce qu'il faut si une interaction avec un objet est détectée (ex: ramassage)
  * \param [in,out] p_jeu : pointeur sur Jeu
  */
void jeuVerifieObjets(Jeu* p_jeu);

/**
  * \brief On considère que si un monstre se trouve sur une case adjacente à link, il se fait attaquer. Cette fonction fait cette vérification et diminue les coeurs de link si nécessaire
  * \param [in,out] p_jeu : pointeur sur Jeu
  */
void jeuVerifieMonstreAttaqueContact(Jeu* p_jeu, clock_t* p_date_derniere_attaque);

/**
  * \brief On considère que si un monstre se trouve sur une case adjacente à link, il se fait attaquer. Cette fonction fait cette vérification et diminue les coeurs de link si nécessaire
  * \param [in,out] p_jeu : pointeur sur Jeu
  */
void jeuVerifieAttaqueEpee(Jeu* p_jeu);

/**
  * \brief Change l'état des monstres qui sont proches de link en "excité", met les autres en "balade"
  * \param [in,out] p_jeu : pointeur sur Jeu
  */
void jeuVerifieEtatMon(Jeu* p_jeu);

/**
  * \brief Renvoie vrai si link est mort (0 vie ou moins), faux sinon
  * \param [in,out] p_jeu : pointeur sur Jeu
  * \return Vrai ou Faux
  */
bool jeuLinkEstMort(const Jeu* p_jeu);

/**
  * \brief Lance les actions correspondant aux différentes actions que l'on peut déclencher en appuyant sur une touche du clavier : déplacement et attaque
  * \param [in,out] p_jeu : pointeur sur Jeu
  * \param [in] touche : caractere
  */
void jeuActionClavier(Jeu* p_jeu, char touche);

/**
  * \brief Déplace les monstres en fonction de leur état : excité ou ballade
  * \param [in,out] p_jeu : pointeur sur Jeu
  */
void jeuDeplaceMonstres (Jeu* p_jeu);


/* A FAIRE : fonctions se chargeant de la gestion des fichiers de sauvegarde
void jeuSauvePartie();

void jeuChargePartie();
*/

/**
  * \brief Lance le test de toutes les fonctions du module
  * \return Vrai si tout s'est bien passé
  */
bool jeuTestRegression(Jeu* p_jeu);

#endif /* JEU_H */
